package model.business;

import java.util.Date;
import java.util.List;

import model.entities.Indisponibilidade;

import dao.IIndisponibilidadeDAO;

import sefaz.util.Paginacao;
import sefaz.util.PaginacaoMotor;
import sefaz.util.Excecao.DAOException;
import sefaz.util.Excecao.InexistenteException;

public class CadastroIndisponibilidade {
	//	objeto Indisponibilidade
	private IIndisponibilidadeDAO indisponibilidade;
	
	public CadastroIndisponibilidade(IIndisponibilidadeDAO l) throws IllegalArgumentException {
		if (l == null){
			throw new  IllegalArgumentException("Argumento nulo");
		}
		this.indisponibilidade = l;		
	}
	
	/**
   	* Atualiza os dados de uma determinada indisponibilidade
   	*
   	* @param objeto Indisponibilidade
   	* @throws Exception
   	*/
	public void atualizar(Indisponibilidade obj) throws Exception{
		Indisponibilidade oIndisponibilidade = pesquisar(obj);
		if(oIndisponibilidade!=null){
			obj.setEstadoAnterior(oIndisponibilidade);
			indisponibilidade.atualizar(obj);
		}else{
			throw new InexistenteException(); 
		}
	}


	/**
	* Inclui os dados de um determinado equipamento
	*
	* @param objeto equipamentoAcesso
	* @throws Exception
	*/
	public void inserir(Indisponibilidade obj)throws DAOException, Exception{
	    if (!isExiste(obj)) {
	    	indisponibilidade.inserir(obj);
	      }
	      else {
	        throw new Exception();
	      }
	}
	
	/**
	 * Exclui os dados de uma determinada indisponibilidade
	 *
	 * @param objeto indisponibilidade
	 * @throws Exception
	 */
	  public void excluir (Indisponibilidade obj) throws Exception{
		  Indisponibilidade oIndisponibilidade = pesquisar(obj);
		  if(oIndisponibilidade!=null){
			  oIndisponibilidade.setDadosUsuarioWeb(obj.getDadosUsuarioWeb());
			  indisponibilidade.excluir(oIndisponibilidade);
		  }else{
			  throw new InexistenteException();
		  }
	  }

	  /**
	  * Retorna uma indisponibilidade.
	  *
	  * @param objeto Indisponibilidade
	  * @return Objeto contendo a indisponibilidade pesquisada
	  * @throws Exception
	  */
	  public Indisponibilidade pesquisar(Indisponibilidade obj) throws Exception{
	    return indisponibilidade.pesquisar(obj);
	  }
	  
	  /**
	   * Retorna todos as indisponibilidades cadastradas paginadas.
	   *
	   * @param int pagina
	   * @param int qtdPorPagina
	   * @param String local 
	   * @return Lista contendo as indisponibilidades pesquisadas paginadas
	   * @throws Exception
	   */
	  public Paginacao paginacaoIndisponibilidade(int pagina, int qtdPorPagina, Date dataInicio, Date dataFim, String local) throws Exception{		  									
		  int numPagina = 1;
		  int qtd = 0;
		  Integer lsIndispTotal = null; 
		  PaginacaoMotor pag = new PaginacaoMotor();
		  List lsIndisp = null;
		  pagina = pagina <=1 ? 1 : pagina;
		  if (pagina <= 1){
			  numPagina = 1;
			  qtd = qtdPorPagina == 0 ? 10 : qtdPorPagina;		 
		  }
		  else{
			  numPagina = (pagina * qtdPorPagina + 1) - qtdPorPagina;
			  qtd = qtdPorPagina;
		  }
	
		  lsIndispTotal = indisponibilidade.calcularTotalRegistro(dataInicio, dataFim, local);
		  lsIndisp = indisponibilidade.pesquisarTodosPaginado(numPagina - 1, qtd, dataInicio, dataFim, local);

		  pag.setQtdTotalRegistros(lsIndispTotal.intValue());
		  return pag.getPagina(lsIndisp, pagina, qtdPorPagina);		  
	  }

		/**
		* Verifica se o equipamento informado existe cadastrado no banco de dados.
		* @param Objeto EquipAcesso. Utilza o codigo do equipamento a ser consultado.
		* @return boolean
		* @throws Exception
		*/
		public boolean isExiste(Indisponibilidade indisponibilidade) throws  DAOException, Exception{
			Indisponibilidade obj = pesquisar(indisponibilidade); 
			return (obj!=null);
		}
	  
}
